package xpn.platform.modules.attachment;

import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.rest.webmvc.RepositoryRestController;
import org.springframework.web.bind.annotation.*;
import xpn.platform.common.repository.XpnRepositoryController;

@RepositoryRestController
@RestController
@RequestMapping("attachments")
public class AttachmentController extends XpnRepositoryController<Attachment, Long> {

	@Autowired
	private AttachmentService attachmentService;

	@Autowired
	private AttachmentDAO attachmentDAO;

	/**
	 * 为指定记录上载附件
	 *
	 * @param entityLink
	 *            ：所属实体的唯一RESTful的链接，必须指定。
	 * @param category
	 *            : 附件分类，可以不指定，缺省值为空
	 * @param filename
	 *            : 附件保存文件名，可以不指定，缺省值为空
	 * @param uploadType
	 *            ： 上载类型，指明UI端使用的上载控件，包括uploadify， ueditor。可以不指定，缺省值为空。
	 * @param thumbnail：
	 *            是否为图片文件生成缩略图，可以不指定，缺省值为false
	 * @param imgWidth：
	 *            缩略图的宽度，可以不指定，缺省值为0
	 * @param imgHeight：
	 *            缩略图的高度，可以不指定，缺省值为0
	 * @param request
	 * @return : 根据UI端使用的上载控件的要求，返回不同的值
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	@PostMapping(value = "file")
	public Object uploadAttachment(
			@RequestParam(value = "entityLink", required = true, defaultValue = "") String entityLink,
			@RequestParam(value = "category", required = false, defaultValue = "") String category,
			@RequestParam(value = "categoryName", required = false, defaultValue = "") String categoryName,
			@RequestParam(value = "filename", required = false, defaultValue = "") String filename,
			@RequestParam(value = "uploadType", required = false, defaultValue = "") String uploadType,
			@RequestParam(value = "saveAttachmentInfo", required = false, defaultValue = "true") boolean saveAttachmentInfo,
			@RequestParam(value = "thumbnail", required = false, defaultValue = "false") boolean thumbnail,
			@RequestParam(value = "imgWidth", required = false, defaultValue = "0") Integer imgWidth,
			@RequestParam(value = "imgHeight", required = false, defaultValue = "0") Integer imgHeight,
			HttpServletRequest request) throws Throwable {

		// 1 调用服务上载附件
		Object fileList = attachmentService.uploadAttachment(entityLink, category,categoryName, filename, saveAttachmentInfo,
				thumbnail, imgWidth, imgHeight,uploadType, request);
        if(uploadType!=null){
        	if(uploadType.equals("preupload")){
        		JSONArray ret=JSONArray.fromObject(fileList);
        		return ret;
        	}
        }
		// 2 根据UI使用的上载控件的要求，构造返回值
		if (uploadType == "uploadify") { // UI使用uploadify上传文件
			if (fileList != null) {
				return "1";
			} else {
				return "0";
			}
		}


		if (uploadType == "ueditor") { // UI使用ueditor上传文件
			Map<String, String> map = new HashMap<String, String>();
			if (fileList == null) {
				map.put("state", "FAIL");
				return map;
			}

			// 处理上传成功的附件
			List<String> list=(List<String>) fileList;
			for (int i = 0; i < list.size(); i++) {
				String fileName = list.get(i);

				String fileUrl = request.getContextPath() + "/attachments?entityLink=" + entityLink + "&filename="
						+ fileName;
				map.put("state", "SUCCESS");
				map.put("url", fileUrl);
				map.put("title", "");
				map.put("original", "");
			}

			return map;
		}

		return fileList;
	}


	/**
	 * 下载指定记录的附件
	 *
	 * @param entityLink
	 *            ：所属实体的唯一RESTful的链接，必须指定。
	 * @param category
	 *            : 附件分类，可以不指定，缺省值为空
	 * @param filename
	 *            : 附件名称 必须指定。
	 * @param forceDownload
	 *            ： 强制下载。可以不指定，缺省值为false。
	 * @param imgSrc
	 *            ： 是否缩略图。可以不指定，缺省值为false。
	 * @param request
	 * @return : 根据UI端使用的上载控件的要求，返回不同的值
	 * @throws Throwable
	 */
	@GetMapping(value = "file")
	public void getAttachment(@RequestParam(value = "entityLink", required = true, defaultValue = "") String entityLink,
			@RequestParam(value = "category", required = false, defaultValue = "") String category,
			@RequestParam(value = "filename", required = false, defaultValue = "") String filename,
			@RequestParam(value = "forceDownload", required = false, defaultValue = "false") Boolean forceDownload,
			@RequestParam(value = "imgSrc", required = false, defaultValue = "false") Boolean imgSrc,
			HttpServletRequest request, HttpServletResponse response) throws Throwable {
		attachmentService.downloadAttachment(request, response, entityLink, category, filename, forceDownload, imgSrc);
	}


	/**
	 * 下载指定记录的附件
	 *
	 * @param entityLink
	 *            ：所属实体的唯一RESTful的链接，必须指定。
	 * @param category
	 *            : 附件分类，可以不指定，缺省值为空
	 * @param filename
	 *            : 附件名称 必须指定。
	 */
	@GetMapping(value = "hasFile")
	public Boolean hasAttachment(@RequestParam(value = "entityLink", required = true, defaultValue = "") String entityLink,
							  @RequestParam(value = "category", required = false, defaultValue = "") String category,
							  @RequestParam(value = "filename", required = false, defaultValue = "") String filename) throws Throwable {
		return attachmentService.hasAttachment( entityLink, category, filename);
	}

	/**
	 * 移动文件
	 *
	 * @param entityLink
	 *            ：所属实体的唯一RESTful的链接，必须指定。
	 * @param category
	 *            : 附件分类，可以不指定，缺省值为空
	 * @param filename
	 *            : 附件名称 必须指定。
	 */
	@RequestMapping(value = "moveFile")
	public Object hasAttachment(@RequestBody JSONObject jsonstring) throws Throwable {
		return attachmentService.moveFile(jsonstring);
	}

	@DeleteMapping(value = "")
	public Object deleteAttachment(@RequestBody Attachment attachment) {
		// 查找有没有相同文件名的记录，如果有就只删除记录不删除文件。
		try {
			List<Attachment> list = attachmentDAO.findByConditions(attachment.getEntityLink(), attachment.getCategory(),
					attachment.getFilename());
			if (!list.isEmpty() && list.size() == 1) {// 只找到一条，说明是自己。大于一条，说明有相同文件名的记录，不删除文件
				attachmentService.deleteAttachment(attachment.getEntityLink(), attachment.getCategory(),
						attachment.getFilename());
			}
			attachmentDAO.delete(attachment);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return "";
	}

	/**
	 * 为指定记录上载附件
	 *
	 * @param entityLink
	 *            ：所属实体的唯一RESTful的链接，必须指定。
	 * @param category
	 *            : 附件分类，可以不指定，缺省值为空
	 * @param filename
	 *            : 附件保存文件名，可以不指定，缺省值为空
	 * @param uploadType
	 *            ： 上载类型，指明UI端使用的上载控件，包括uploadify， ueditor。可以不指定，缺省值为空。
	 * @param thumbnail：
	 *            是否为图片文件生成缩略图，可以不指定，缺省值为false
	 * @param imgWidth：
	 *            缩略图的宽度，可以不指定，缺省值为0
	 * @param imgHeight：
	 *            缩略图的高度，可以不指定，缺省值为0
	 * @param request
	 * @return : 根据UI端使用的上载控件的要求，返回不同的值
	 * @throws Throwable
	 */
	@RequestMapping(value = "queryAttachments")
	public Object queryAttachments(
			@RequestParam(value = "entityLinks", required = true, defaultValue = "") String entityLinks,//多个链接用,分隔
			@RequestParam(value = "categorys", required = false, defaultValue = "") String categorys) throws Throwable {

		// 1 调用服务上载附件
		Object ret = attachmentService.queryAttachments(entityLinks, categorys);
		return ret;
	}

}
